package main

// 结构体
/**
结构体是一种聚合类型，里面可以包含任意类型的值，这些值就是我们定义的结构体的成员，也称为字段。在 Go 语言中，要自定义一个结构体，需要使用 type+struct 关键字组合。
在下面的例子中，我自定义了一个结构体类型，名称为 person，表示一个人。这个 person 结构体有两个字段：name 代表这个人的名字，age 代表这个人的年龄。
*/
type person struct {
	name string
	age  uint
}

/**
在定义结构体时，字段的声明方法和平时声明一个变量是一样的，都是变量名在前，类型在后，只不过在结构体中，变量名称为成员名或字段名。
结构体的成员字段并不是必需的，也可以一个字段都没有，这种结构体成为空结构体。
*/

//func main() {
//	// 结构体的初始化 不赋值就是零值
//	var ming person
//	fmt.Println(ming)
//	// 或者直接使用字面量初始化值
//	/**
//	采用字面量初始化结构体时，初始化值的顺序很重要，必须和字段定义的顺序一致。
//	在 person 这个结构体中，第一个字段是 string 类型的 name，第二个字段是 uint 类型的 age，所以在初始化的时候，初始化值的类型顺序必须一一对应，才能编译通过。
//	 */
//	mingkai := person{"明凯",29}
//	fmt.Println(mingkai)
//	// 访问结构体中的字段
//	fmt.Println(mingkai.name,mingkai.age)
//
//	// 那么是否可以不按照顺序初始化呢？当然可以，只不过需要指出字段名称
//	clearlove := person{age:29,name: "明凯"}
//	fmt.Println(clearlove)
//
//	// 当然你也可以只初始化字段 age，字段 name 使用默认的零值，如下面的代码所示，仍然可以编译通过。
//	p:=person{age:30}
//	fmt.Println(p)
//}

//字段结构体
// 结构体的字段可以是任意类型，也包括自定义的结构体类型，比如下面的代码：
type Student struct {
	name    string
	age     uint
	address Address
}

type Address struct {
	province string
	city     string
}

//func main() {
//	flandure := Student{
//		name:"圣枪哥",
//		age:23,
//		address: Address{
//			province: "云南",
//			city: "大理",
//		},
//	}
//	fmt.Println(flandure)
//	fmt.Println(flandure.address.city) // 访问结构体中结构体的属性
//}
